package 注解;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * <b>所属项目:</b>Java_base<br/>
 * <b>description:</b>
 * </br>@Retention元注解，表示需要在什么级别保存该注释信息（生命周期）。可选的RetentionPoicy参数包括<br/>
 * RetentionPolicy.SOURCE: 停留在java源文件，编译器被丢掉<br/>
 * RetentionPolicy.CLASS：停留在class文件中，但会被VM丢弃（默认）<br/>
 * RetentionPolicy.RUNTIME：内存中的字节码，VM将在运行时也保留注解，因此可以通过反射机制读取注解的信息<br/>
 *
 * </br>@Target元注解，默认值为任何元素，表示该注解用于什么地方。可用的ElementType参数包括<br/>
 * ElementType.CONSTRUCTOR: 构造器声明<br/>
 * ElementType.FIELD: 成员变量、对象、属性（包括enum实例）<br/>
 * ElementType.LOCAL_VARIABLE: 局部变量声明<br/>
 * ElementType.METHOD: 方法声明<br/>
 * ElementType.PACKAGE: 包声明<br/>
 * ElementType.PARAMETER: 参数声明<br/>
 * ElementType.TYPE: 类、接口（包括注解类型)或enum声明<br/>
 *
 * </br>@Inheried允许子类继承父类中的注解
 * <p>
 * <br/><br/>
 *
 * @author wanyuxiang
 * @currentTime 2014年12月13日 下午12:27:54
 */
public class TestAnnotation {

    @MyAnnotation(gender = Gender.Woman, color = "red", argumentArrray = {1, 2, 3}, value = "returnValue", mataAnnotation = @MataAnnotation(birthday = "1991-08-01 12:00:00"))
    public static void returnDefault() {
        Method[] methods = TestAnnotation.class.getMethods();
        Method expectMethod = null;
        for (Method method : methods) {
            if ("returnDefault".equals(method.getName())) {
                expectMethod = method;
                break;
            }
        }
        //isAnnotationPresent的方法来判断某个方法是否使用了某个annotation进行注解
        boolean bool = expectMethod.isAnnotationPresent(MyAnnotation.class);
        if (bool) {
            MyAnnotation myAnnotation = expectMethod.getAnnotation(MyAnnotation.class);
            System.out.println(myAnnotation.gender());
            System.out.println(myAnnotation.color());
            System.out.println(Arrays.toString(myAnnotation.argumentArrray()));
            System.out.println(myAnnotation.value());
            MataAnnotation ma = myAnnotation.mataAnnotation();
            System.out.println(ma.birthday());
        }
    }

    public static void main(String[] args) {
        TestAnnotation.returnDefault();
    }

}
